<?php
declare(strict_types=1);
/**
 * Created by PhpStorm.
 * User: wumengmeng <wu_mengmeng@foxmail.com>
 * Date: 2019/4/26 0026
 * Time: 11:18
 */

namespace Modules\SmallApi\Service;

use Cache;
use HiCommon\Model\Users;
use HiCommon\Repository\UsersRepository;
use HiCommon\Service\LoginUserService;
use HiCommon\Service\LogService;
use Illuminate\Support\Facades\Hash;

class LoginService extends BaseService
{

    /**
     * 通过openid获取小程序openid
     *
     * @param $s_jscode
     *
     * @return array
     * @author wumengmeng <wu_mengmeng@foxmail.com>
     */
    public function get_small_openid_by_code($s_jscode)
    {
        try {

            if (!$s_jscode) {
                return hello_error('code参数为null！');
            }

            //获取openid和session的地址
            //定义好的appid、appsecret等有关小程序配置的数组常量
            $wechat_data= small_wechat_congfig();
            $url=$wechat_data['url_get_openid'];
            $param = [
              'appid'=>$wechat_data['app_id'],
              'secret'=>$wechat_data['app_secret'],
              'js_code'=>$s_jscode,
              'grant_type'=>'authorization_code',
            ];
            $result = curl_post($url,$param);
            $result = json_decode($result,true);

            if($result['errcode'] != 0){
                return hello_error($result['errmsg'],$result,$result['errcode']);
            }
            return  hello_success('成功',$result);
        } catch (\Exception $exception) {
            return hello_error('失败',[],$exception->getMessage());
        }
    }

//    /**
//     * 小程序微信登录
//     *
//     * @param $arr_input
//     *
//     * @return array
//     * @author wumengmeng <wu_mengmeng@foxmail.com>
//     */
//    public function login_in_by_jscode($arr_input){
//        try {
//            if(empty($arr_input['code'])){
//                return hello_error('code 不能为空');
//            }
//            if(empty($arr_input['iv'])){
//                return hello_error('iv 不能为空');
//            }
//            if(empty($arr_input['encrypted_data'])){
//                return hello_error('encrypted_data 不能为空');
//            }
//
//            $s_jscode = $arr_input['code'];
//            $s_unique_token = str_trim($arr_input['unique_token']);
//
//            //获取openid
//            $res =  self::get_small_openid_by_code($s_jscode);
//            if($res['state'] != 0){
//                return $res;
//            }
//
//
//            //获取用户信息
//            $encryptedData = $arr_input['encrypted_data'];
//            $iv = $arr_input['iv'];
//            $sessionKey = $res['data']['session_key'];
//            $openid = $res['data']['openid'];
//            $unionid = empty($res['data']['unionid']) ? '':$res['data']['unionid'];
//            $res = small_wechat_biz_data_crypt($sessionKey, $encryptedData, $iv, $data);
//            if($res['state'] != 0){
//                return $res;
//            }
//            $small_user = json_decode($data,true);
//            $redis_key = 'session_key:'.$openid;
//            redis_string_set($redis_key,$sessionKey);
////            Cache::forever('session_key:'.$openid,$sessionKey);//将session_key缓存起来
//
//            /*老用户直接登录 新用户注册后再登录*/
//
//            //查询是否是新用户
//            $arr_where = ['small_openid'=>$openid];
//            $arr_user = UsersRepository::get_all_by_where($arr_where)->toarray();
//            $n_count_user = count($arr_user);
//            if($n_count_user <= 0){
//                $s_user_name = 'xinda'.uniqid();
//                $s_pass = '123456';
//
//                //注册
//                $arr_data = [
//                  'username'=>$s_user_name,
//                  'password'=>Hash::make($s_pass),
//                  'pass'=>$s_pass,
//                  'nickname'=>$small_user['nickName'],
//                  'small_openid'=>$openid,
//                  'unionid'=>$unionid,
//                  'sex'=>$small_user['gender'],
//                  'head_img'=>$small_user['avatarUrl'],
//                ];
//                $result = LoginUserService::api_register_user($arr_data);
//                $arr_user = $result['data'];
//                $n_uid = $arr_user['id'];
//                if($result['state'] != 0){
//                    return $result;
//                }
//
//                $arr_where_login = ['username'=>$s_user_name,'password'=>$s_pass];
//
//                //邀请有礼
//                if(!empty($s_unique_token)){
//                    LogService::wright_log_for_user('邀请有礼',['to_uid'=>$n_uid,'unique_token'=>$s_unique_token],'info');//记录日志
//
//                    $res = UsersRepository::get_one_by_where(['unique_token'=>$s_unique_token],['field'=>['id','unique_token']])->toarray();
//                    if(empty($res)){
//                        return hello_error('注册失败2');
//                    }
//                    $n_to_uid = $res['id'];
//                    FeedbackService::send_coupon_to_user($n_to_uid,$n_uid);
//                }
//
//            }
//            elseif($n_count_user != 1){
//                return hello_error('用户重复-请联系管理员处理');
//            }
//            else{
//                //登录
//                $arr_where_login = ['username'=>$arr_user[0]['username'],'password'=>$arr_user[0]['pass']];
//            }
//            //用户登录
//            return self::login($arr_where_login);
//        }
//        catch (\Exception $exception) {
//            return ['state'=>1,'msg'=>'失败','data'=>[],'error'=>$exception->getMessage()];
//        }
//
//    }

    /**
     * 小程序微信获取用户信息
     *
     * @param $arr_input
     *
     * @return array
     * @author wumengmeng <wu_mengmeng@foxmail.com>
     */
    public function get_mini_wechat_phone($arr_input){
        try {
            if(empty($arr_input['iv'])){
                return hello_error('iv 不能为空');
            }
            if(empty($arr_input['encrypted_data'])){
                return hello_error('encrypted_data 不能为空');
            }
            if(empty($arr_input['small_openid'])){
                return hello_error('小程序openid不能为空');
            }
//            $sessionKey = Cache::get('session_key:'.$arr_input['small_openid']);//

            $redis_key = 'session_key:'.$arr_input['small_openid'];
            $sessionKey = redis_string_get($redis_key);
            $encryptedData = $arr_input['encrypted_data'];
            $iv = $arr_input['iv'];

            $res = small_wechat_biz_data_crypt($sessionKey, $encryptedData, $iv, $data);
            if($res['state'] != 0){
                return $res;
            }
            $data = json_decode($data,true);
            return  hello_success('成功',$data);
        }
        catch (\Exception $exception) {
            return ['state'=>1,'msg'=>'失败','data'=>[],'error'=>$exception->getMessage()];
        }

    }



    /**
     * 用户登录
     *
     * @param array $arr_data
     *
     * @return array
     * @author wumengmeng <wu_mengmeng@foxmail.com>
     */
    public function login(array $arr_data)
    {
        try {
            //用户登录
            $token = small_api_guard()->attempt($arr_data);
            if (!$token) {
                return ['state'=>1,'msg'=>'登录失败-Unauthorized','error'=>401,'data'=>[]];
            }

            $arr_user = small_api_guard()->user()->toarray();
            $arr_user = [
              'id'=>$arr_user['id'],
              'username'=>$arr_user['username'],
              'nickname'=>$arr_user['nickname'],
              'head_img'=>$arr_user['head_img'],
              'email'=>$arr_user['email'],
              'phone'=>$arr_user['phone'],
              'sex'=>$arr_user['sex'],
              'realname'=>$arr_user['realname'],
              'birthday'=>$arr_user['birthday'],
            ];
                $arr_token = [
                  'user'=>$arr_user,
                  'access_token' => $token,
                  'token_type' => 'bearer',
                  'expires_in' => small_api_guard()->factory()->getTTL() * 60
                ];

            if (small_api_user()->status == 2) {
                small_api_offset_user();
                return ['state'=>1,'msg'=>'账户被禁用','error'=>'','data'=>[]];
            }
            return ['state'=>0,'msg'=>'登录成功','error'=>'','data'=>$arr_token];

        } catch (\Exception $exception) {
            return ['state'=>1,'msg'=>$exception->getMessage()];
        }

    }

//    /**
//     * 通过用户名密码注册账号
//     *
//     * @param $arr_input
//     *
//     * @return array
//     * @author wumengmeng <wu_mengmeng@foxmail.com>
//     */
//    public function register_by_username_pass($arr_input){
//        try {
//            if(empty($arr_input['username'])){
//                return hello_error('用户名不能为空');
//            }
//            if(empty($arr_input['password'])){
//                return hello_error('密码不能为空');
//            }
//
//            //查询用户是否已注册
//            $arr_where = ['username'=>$arr_input['username']];
//            $res = UsersRepository::get_all_by_where($arr_where)->toarray();
//            if(count($res) >= 1){
//                return hello_error('账号已注册');
//            }
//
//            $arr_input['pass'] = $arr_input['password'];
//            $arr_input['password'] = Hash::make($arr_input['password']);
//            $res = UsersRepository::add_one($arr_input)->toarray();
//            if(empty($res)){
//                return hello_error('注册失败');
//            }
//            return  hello_success('注册成功');
//        }
//        catch (\Exception $exception) {
//            return ['state'=>1,'msg'=>'失败','data'=>[],'error'=>$exception->getMessage()];
//        }
//
//    }

    /**
     * 用户名密码登录
     *
     * @param $arr_input
     *
     * @return array
     * @author wumengmeng <wu_mengmeng@foxmail.com>
     */
    public function login_in_by_username_pass($arr_input){


        try {
            if(empty($arr_input['username'])){
                return hello_error('用户名不能为空');
            }
            if(empty($arr_input['password'])){
                return hello_error('密码不能为空');
            }
            //用户登录
            return self::login($arr_input);
        }
        catch (\Exception $exception) {
            return ['state'=>1,'msg'=>'失败','data'=>[],'error'=>$exception->getMessage()];
        }
    }


}